package com.axend.lib_base.ext

import java.math.BigDecimal
import java.math.RoundingMode
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.text.DecimalFormat
import kotlin.math.roundToInt

/**
 * float转string带默认值
 */
fun Float.toStrOrDefault(defaultValue: String = ""): String {
    return this.toString().trim().toFloatOrNull()?.toString() ?: defaultValue
}

/**
 * 带默认值的float类型
 */
fun Float?.orDefault(defaultValue: Float = 0f): Float {
    return this ?: defaultValue
}


// 摄氏转华氏
fun Float.celsiusToFahrenheit(): Float {
    return this * 9 / 5 + 32
}

// 华氏转摄氏
fun Float.fahrenheitToCelsius(): Float {
    return (this - 32) * 5 / 9
}
// 摄氏转华氏(不加32华氏度)
fun Float.celsiusToFahrenheitNoAdd32(): Float {
    return this * 9 / 5
}

// 华氏转摄氏(不减32华氏度)
fun Float.fahrenheitToCelsiusNoSub32(): Float {
    return this * 5 / 9
}

/**
 * 精确到一位小数
 */
fun Float.roundToFloatOneDecimal(): Float {
    return (this * 10).roundToInt() / 10f
}

/**
 * 字符串精确到一位小数
 */
fun Float.roundToOneDecimalPlace(): String {
    return String.format("%.1f", this)
}

/**
 * 不保留小数位
 */
fun Float.roundToNoDecimalPlaces(): String {
    return String.format("%.0f", this)
}

/**
 * 精确到整数
 */
fun Float.roundToNearestInteger(): Int {
    return roundToInt()
}



/**
 * DecimalFormat转string避免科学计数法
 */
fun Float.toPlainStringNoRounding(): String {
    // 将 Float 转换为 BigDecimal，避免科学计数法
    val bd = BigDecimal.valueOf(this.toDouble())

    // 设置小数点后的位数，这里设为6位，并且使用 RoundingMode.DOWN 来避免四舍五入
    val noRounding = bd.setScale(6, RoundingMode.DOWN)

    // 使用 DecimalFormat 来格式化数字，避免科学计数法
    val df = DecimalFormat("0.0")
    df.isDecimalSeparatorAlwaysShown = true // 确保小数点总是显示，即使没有小数部分

    return df.format(noRounding)
}

/**
 * DecimalFormat转string避免科学计数法(6位)
 */
fun Float.toPlainStringNoRoundingSix(): String {
    // 将 Float 转换为 BigDecimal，避免科学计数法
    val bd = BigDecimal.valueOf(this.toDouble())

    // 设置小数点后的位数，这里设为6位，并且使用 RoundingMode.DOWN 来避免四舍五入
    val noRounding = bd.setScale(6, RoundingMode.DOWN)

    // 使用 DecimalFormat 来格式化数字，避免科学计数法
    val df = DecimalFormat("0.000000")
    df.isDecimalSeparatorAlwaysShown = true // 确保小数点总是显示，即使没有小数部分

    return df.format(noRounding)
}

/**
 * 保留六位小数
 */
fun Float.roundToSixDecimalPlaces(): Float {
    return BigDecimal(this.toString()).setScale(6, RoundingMode.HALF_UP).toFloat()
}


/**
 * m换算成cm
 */
fun Float.mToCm(): Float {
    return this * 100
}


/**
 * m换算成in
 */
fun Float.mToIn(): Float {
    return this * 39.37f
}


/**
 * kg换算成lbs
 */
fun Float.kgToLbs(): Float {
    return this * 2.2046f

}


/**
 * lbs换算成kg
 */
fun Float.lbsToKg(): Float {
    return this * 0.4536f
}


fun Float.toByteArray(): ByteArray {
    val buffer = ByteBuffer.allocate(4)
    buffer.order(ByteOrder.BIG_ENDIAN) // 设置字节序为大端模式
    buffer.putFloat(this)
    return buffer.array()
}

fun Int.toByteArray(): ByteArray {
    val buffer = ByteBuffer.allocate(4)
    buffer.order(ByteOrder.BIG_ENDIAN) // 设置字节序为大端模式
    buffer.putInt(this)
    return buffer.array()
}

// 扩展函数，将 UInt 转换为 4 字节数组
fun UInt.toByteArray(): ByteArray {
    return byteArrayOf(
        (this shr 24).toByte(),
        (this shr 16).toByte(),
        (this shr 8).toByte(),
        this.toByte()
    )
}